Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Ανάγνωση περιεχομένων text αρχείου μέσω web service

Îåêßíçóå áðü ôï ìÝëïò R@_. Τελευταία δημοσίευση από το μέλος R@_ στις 17-12-2007, 10:58. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  13-12-2007, 18:41 38325

    Ανάγνωση περιεχομένων text αρχείου μέσω web service

    Έχω το εξής web method :

    <WebMethod()> Public Function GetTextFileContents(ByVal Filename As String) As String

    GetTextFileContents = ""

    Try

    Return My.Computer.FileSystem.ReadAllText(Filename)

    Catch ex As Exception

    m_lgrLogging.Trace("GetTextFileContents : " & ex.ToString)

    End Try

    End Function

    Εφόσον το αρχείο Filename βρίσκεται στο ίδιο μηχάνημα που τρέχει το web service δεν θα έπρεπε όταν καλώ αυτή την μέθοδο να πάρω τα περιεχόμενά του; Στον φακελο που είναι μέσα το αρχείο Filename έχουν δικαιώματα read/write ο ASP.NET Machine Account, ο IWAM και ο IUSR. Το web service είναι εγκατεστημένο σε ένα μηχάνημα Windows 2000 Professional και δεν βρίσκεται στο τοπικό δίκτυο. Για να είμαι σίγουρος ότι βλέπω κάθε φορά το σωστό web service έχω και αυτή τη μέθοδο :

    <WebMethod()> _

    Public Function Hello() As String

    Dim strText As String = ""

    Hello = ""

    Try

    m_lgrLogging.LogFileName = TRACE_LOG

    strText = "Hello from : " & My.Computer.Name

    m_lgrLogging.Trace(strText)

    Return strText

    Catch ex As Exception

    m_lgrLogging.Trace(ex.ToString)

    Finally

    End Try

    End Function

    Όταν καλώ την Hello μου επιστρέφει το όνομα του μηχανήτος που περιμένω άρα είμαι βέβαιος ότι μιλάω με το σωστό ws. Το πρόβλημά μου είναι ότι η GetTextFileContents δεν δουλεύει όπως θα περίμενα. Δηλαδή εάν έχω σε πανομοιότυπο path στο μηχάνημά μου το ίδιο αρχείο θα μου επιστρέψει τα περιεχόμενά του. Πώς είναι δυνατόν να δουλεύει με έναν τρόπο η My.Computer.Name και η My.Computer.FileSystem.ReadAllText να δουλεύει με έναν άλλο;

    Ευχαριστώ

  •  13-12-2007, 18:58 38326 σε απάντηση της 38325

    Απ: Ανάγνωση περιεχομένων text αρχείου μέσω web service

    R@_:
    Το πρόβλημά μου είναι ότι η GetTextFileContents δεν δουλεύει όπως θα περίμενα. Δηλαδή εάν έχω σε πανομοιότυπο path στο μηχάνημά μου το ίδιο αρχείο θα μου επιστρέψει τα περιεχόμενά του. Πώς είναι δυνατόν να δουλεύει με έναν τρόπο η My.Computer.Name και η My.Computer.FileSystem.ReadAllText να δουλεύει με έναν άλλο;


    ... δε μας λες όμως πως συμπεριφέρεται τελικά. Στην πρώτη ανάγνωση του post σου, θα πίστευε κανείς ότι το remote call στο W/S, σου επιστρέφει τα περιεχόμενα του τοπικού σου αρχείου, πράγμα παντελώς αδύνατον αν είναι όντως remote call.



    Angel
    O:]
  •  13-12-2007, 22:05 38328 σε απάντηση της 38325

    Απ: Ανάγνωση περιεχομένων text αρχείου μέσω web service

    Αν έχεις δώσει το πλήρες path του αρχείου στην παράμετρο filename τότε η ReadAllText θα σου επιστρέψει το περιεχόμενο του αρχείου. Αν έχεις δώσει μόνο το όνομα του αρχείου, η ReadAllText θα ψάξει να βρει το αρχείο στο directory που θεωρείται running directory για το web service - το οποίο δεν είμαι σίγουρος ποιό είναι αλλά υποθέτω ότι θα είναι το directory του web site. Μήπως λοιπόν η ReadAllText πάει να ανοίξει άλλο αρχείο από αυτό που περίμενες?

    Σκέψου πάντως ότι ο τρόπος με τον οποίο έχεις γράψει την GetTextFileContents δεν είναι και πολύ σωστός. Ή θα πρέπει να περνάς ολόκληρο το path του αρχείου (το οποίο σημαίνει ότι ο client θα πρέπει να ξέρει που να βρει το αρχείο) ή θα πρέπει να βάλεις όλα τα αρχεία μέσα στο directory του web service. Θα είναι πολύ καλύτερο να ορίσεις το path των αρχείων ως property και μετά να συνδυάσεις το όνομα του αρχείου με την τιμή της παραμέτρου χρησιμοποιώντας την System.IO.Path.Combine . Έτσι θα μπορείς να έχεις τα αρχεία σου όπου θέλεις χωρίς να πρέπει αυτό να το ξέρει και ο client του web service.

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  13-12-2007, 23:15 38333 σε απάντηση της 38326

    Απ: Ανάγνωση περιεχομένων text αρχείου μέσω web service

    anjelinio:
    Στην πρώτη ανάγνωση του post σου, θα πίστευε κανείς ότι το remote call στο W/S, σου επιστρέφει τα περιεχόμενα του τοπικού σου αρχείου, πράγμα παντελώς αδύνατον αν είναι όντως remote call.


    Κι εγώ αυτό θα έλεγα, όμως αυτό που είδα με τα μάτια μου με διέψευσε. Την πρώτη φορά που το δοκίμασα μου γύρισε κενό string. Την δεύτερη φορά έβαλα το ίδιο αρχείο στο δικό μου pc στο ίδιο directory (και για να είμαι σίγουρος άλλαξα και το περιεχόμενό του), έτρεξα τον client και μου γύρισε τα περιεχόμενα του τοπικού αρχείου. Και τις δύο φορές καλούσα και την Hello για να βεβαιωθώ ότι παίζει το σωστό ws. Το ξέρω ότι ακούγεται τρελό αλλά έχω μάρτυρα και τον προϊστάμενο Stick out tongue

    Παναγιώτης Καναβός:
    Σκέψου πάντως ότι ο τρόπος με τον οποίο έχεις γράψει την GetTextFileContents δεν είναι και πολύ σωστός. Ή θα πρέπει να περνάς ολόκληρο το path του αρχείου (το οποίο σημαίνει ότι ο client θα πρέπει να ξέρει που να βρει το αρχείο) ή θα πρέπει να βάλεις όλα τα αρχεία μέσα στο directory του web service.

    Συμφωνώ απόλυτα με αυτό που λές. Απλά, στην προκειμένη περίπτωση έχω το πλήρη έλεγχο για την ονομασία του συγκεκριμένου αρχείου και της φυσικής του θέσης στον σκληρό δίσκο. Στα τεστ που έκανα, έδινα το πλήρες όνομα όπως ακριβώς βρισκόταν στο μηχάνημα που έτρεχε το ws.
  •  14-12-2007, 12:03 38349 σε απάντηση της 38325

    Απ: Ανάγνωση περιεχομένων text αρχείου μέσω web service

    Πριν από λίγο είχα την ιδέα να σταματήσω το default web site στον IIS του μηχανήματός μου όπου τρέχω και τον client. Δοκίμασα πάλι και πήρα το εξής μήνυμα :

    WSClient_GetTextFileContents : System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it
       at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
       at System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)
       at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)
       --- End of inner exception stack trace ---
       at System.Net.HttpWebRequest.GetRequestStream()
       at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
       at AsyncTicketDataOperator.TicDatWS.TicketData.GetTextFileContents(String Filename) in C:\Projects\AsyncTicketDataOperator\AsyncTicketDataOperator\Web References\TicDatWS\Reference.vb:line 182
       at AsyncTicketDataOperator.TDOperatorAsync.WSClient_GetTextFileContents(String FileName, String& ErrorMessage) in C:\Projects\AsyncTicketDataOperator\AsyncTicketDataOperator\TDOperatorAsync.vb:line 815

    Στον client ο κώδικας που χρησιμοποιώ είναι ο ακόλουθος :

    Private Sub btnHello_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHello.Click

    Try

    Dim strError As String = ""

    MessageBox.Show(m_tdwsAsync.WSClient_Greetings(strError))

    If strError.Length > 0 Then

    MessageBox.Show(strError)

    End If

    MessageBox.Show(m_tdwsAsync.WSClient_GetTextFileContents(InputBox("Full path text filename to be read (on Web Service Machine):"), strError))

    If strError.Length > 0 Then

    MessageBox.Show(strError)

    End If

    Catch ex As Exception

    MessageBox.Show(ex.Message)

    End Try

    End Sub

    Το m_tdwsAsync είναι ένα instance του DLL το οποίο χρησιμοποιεί το web service. Είναι δηλωμένο σε module-level ως :

    Private WithEvents m_tdwsAsync As AsyncTicketDataOperator.TDOperatorAsync

    Το AsyncTicketDataOperator καλεί μια μέθοδο του web service ασύγχρονα. Μέσα στο event complete της μεθόδου του web service κάνω RaiseEvent το event του AsyncTicketDataOperator. Τώρα η χρήση του DLL συγκεκριμένα για την ασύγχρονη μέθοδο μέσα από τον client είναι τουλάχιστον προβληματική. Την πρώτη φορά που θα ξεκινήσω τη διαδικασία (με button) φαίνεται ότι  δεν παίζει. Πρέπει να το ξαναπατήσω για να παίξει. Έχω ξεφύγει όμως από το θέμα του post και μάλλον θα πρέπει να ανοίξω ένα καινούριο.

  •  16-12-2007, 15:51 38388 σε απάντηση της 38349

    Απ: Ανάγνωση περιεχομένων text αρχείου μέσω web service

    Κάνω κάποιο λάθος, ή αυτό ενισχύει την άποψη ότι το call σου δεν ήταν τελικά remote call σε άλλο machine, αλλά στον τοπικό σου IIS ; Μήπως πρέπει να ξανακοιτάξεις τον τρόπο με τον οποίο παίρνεις τα proxies προς το web service, και πως γίνονται αυτά initialize ?

    Angel
    O:]
  •  17-12-2007, 10:58 38422 σε απάντηση της 38388

    Απ: Ανάγνωση περιεχομένων text αρχείου μέσω web service

    Αυτό που λές ήταν τελικά. Μέσα στο DLL είχα κάνει το λάθος να δηλώσω το module-level instance του web service με new με αποτέλεσμα να δημιουργείται πριν περάσω την πληροφορία της τοποθεσίας του web service. Όταν έβγαλα το new από τη δήλωσή του και το έκανα στην Sub New του DLL, έπαιξε Smile

    Σ'ευχαριστώ πολύ.

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems